]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
appDisplay: Don't leak duplicate items in AppView
authorRay Strode <rstrode@redhat.com>
Mon, 15 Jul 2019 17:52:58 +0000 (13:52 -0400)
committerRay Strode <halfline@gmail.com>
Tue, 23 Jul 2019 14:53:24 +0000 (14:53 +0000)
If an icon already exists in an app view with the same id, the
duplicate is not added on a call to addItem.  Unfortunately,
since it's not added, the icon actor gets orphaned and leaked.

This commit address the problem by introducing a new hasItem
method and disallowing callers to call addItem with a duplicate
in the first place.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628

js/ui/appDisplay.js

index 8bfdd1707a78b24b774c59c888e036a7374f7e55..cd7a23e96b81a9dcc1dbc77390674f4762a589b3 100644 (file)
@@ -128,10 +128,14 @@ class BaseAppView {
         return this._allItems;
     }
 
+    hasItem(id) {
+        return this._items[id] !== undefined;
+    }
+
     addItem(icon) {
         let id = icon.id;
-        if (this._items[id] !== undefined)
-            return;
+       if (this.hasItem(id))
+            throw new Error(`icon with id ${id} already added to view`)
 
         this._allItems.push(icon);
         this._items[id] = icon;
@@ -371,6 +375,8 @@ var AllView = class AllView extends BaseAppView {
 
         let folders = this._folderSettings.get_strv('folder-children');
         folders.forEach(id => {
+            if (this.hasItem(id))
+                return;
             let path = this._folderSettings.path + 'folders/' + id + '/';
             let icon = new FolderIcon(id, path, this);
             icon.connect('name-changed', this._itemNameChanged.bind(this));
@@ -1151,6 +1157,9 @@ var FolderIcon = class FolderIcon {
         let excludedApps = this._folder.get_strv('excluded-apps');
         let appSys = Shell.AppSystem.get_default();
         let addAppId = appId => {
+            if (this.view.hasItem(appId))
+                return;
+
             if (excludedApps.includes(appId))
                 return;